home *** CD-ROM | disk | FTP | other *** search
/ Technotools / Technotools (Chestnut CD-ROM)(1993).ISO / lang_c / cug191 / w-form.c < prev    next >
Text File  |  1986-04-17  |  6KB  |  179 lines

  1. /*#title 'W_FORM    04/18/86' */
  2. /****************************************************************
  3. **                                                             **
  4. **      file: W_FORM.C                                            **
  5. **                                                             **
  6. **      library function:   w_form                             **
  7. **                                                             **
  8. **      programmer: George Woodley                             **
  9. **                                                             **
  10. *****************************************************************
  11.  
  12.     NAME
  13.         w_form - Fill a c_window with a form from a file.
  14.  
  15.     SYNOPSIS
  16.         success = w_form (x, y, fname_ptr, tab_int, stop_ptr);
  17.             WORD success,            1 if success, 0 if error.
  18.                  x, y;                Initial upper left-hand
  19.                                      coordinates in writeable
  20.                                      portion of window.
  21.             char *fname_ptr;        Pointer to an ASCII file.
  22.             WORD tab_int,            Tabs are set every TAB_INT chars.
  23.                  *stop_ptr;            Pointer to a table filled in by 
  24.                                      W_FORM.
  25.  
  26.     DESCRIPTION
  27.         W_FORM takes an ASCII file as its input and fills a 
  28.         Chris McVicar C_WINDOW with its contents.  The file must
  29.         consist of lines (max 80 chars) of the following chars:
  30.         * Normal chars are just printed.  If the result exceeds
  31.           window dimensions, chars will be wrapped around or
  32.           scrolled.
  33.         * Tabs are expanded into spaces as directed by the TAB_INT
  34.           parameter.
  35.         * LF's result in output of the line to the window.
  36.         * CR's are discarded.
  37.         * Extended ASCII chars may be used to form borders (or the
  38.           normal C_WINDOW border functions may be used).
  39.         * The special char Ç (code 128 or 0x80) may be used to mark
  40.           a stop in the form.  The x, y coordinates of this char will
  41.           be stored in the table pointed to by STOP_PTR for each
  42.           occurrence of the char.  The table will be terminated by 
  43.           x = -1 (0xFFFF).  This char will be translated to a space
  44.           during display.
  45.         * The char Control-Z (0x1A), if used, marks End-of-file.
  46.  
  47.         Thus, a form can be easily created using an editor and put
  48.         up using W_FORM and the C Windowing Toolbox software.
  49.  
  50.     CAUTIONS
  51.         Allocate two words for every occurrence of a stop char, plus
  52.         one word for the sentinel.  Allocate at least one word.
  53.  
  54.         A line may not exceed 80 chars.
  55. ****************************************************************/
  56. /*#eject */
  57.  
  58. #include "STD.H"
  59. #include "C_WDEF.H"
  60. #include "STDIO.H"
  61. #include "STDLIB.H"
  62.  
  63.  
  64. #define HT        0x09        /* horizontal tab */
  65. #define SUB        0x1A        /* control-Z (EOF)*/
  66. #define STOP    (BYTE)128    /* marks a stop */
  67.  
  68. static    BYTE file_buff[512];        /* file buffer */
  69.  
  70. /****************************************************************
  71.     W_FORM function
  72. ****************************************************************/
  73. WORD w_form (x, y, fname_ptr, tab_int, stop_ptr)
  74.  
  75. WORD x, y;
  76. char *fname_ptr;
  77. WORD tab_int, *stop_ptr;
  78.  
  79. {
  80.     char    *buff_ptr,    /* pointer to line buffer */
  81.             buff [84];    /* line composition buffer */
  82.     BYTE    fc;            /* char read from file */
  83.     BOOLEAN    ldone,        /* done with line */
  84.             done;        /* done with file */
  85.     WORD    count,        /* count of chars/line */
  86.             f_ix,        /* file_buff index */
  87.             fix_max,    /* max value of f_ix */
  88.             success;    /* success of function */
  89.     FILE    *handle;    /* file handle */
  90.  
  91. /* Attempt to open file in translated mode */
  92.     if (!(handle = fopen (fname_ptr, "rt")))  {
  93.         w_msg ("W_FORM - file not found");
  94.         return (FALSE);            /* file does not exist */
  95.         }
  96. /* Read in the first buffer */
  97.     if (!(fix_max = fread ((char *)file_buff, sizeof(BYTE), 
  98.                            sizeof(file_buff), handle)))  {
  99.         fclose (handle);
  100.         w_msg ("W_FORM - file empty");
  101.         return (FALSE);            /* file is empty */
  102.         }
  103.  
  104.     f_ix = 0;
  105.     success = TRUE;
  106.     done = FALSE;
  107.  
  108. /* here for every line */
  109.     while (!done)  {
  110.         buff_ptr = buff;
  111.         count = 0;
  112.         ldone = FALSE;
  113. /*#eject */
  114.     /* here for every char */
  115.         while (!ldone)  {
  116.     /* check if file_buff has been processed */
  117.             if (f_ix == fix_max)  {
  118.                 fix_max = fread ((char *)file_buff, sizeof(BYTE), 
  119.                                  sizeof(file_buff), handle);
  120.                 f_ix = 0;
  121.                 }
  122.             fc = file_buff [f_ix++];
  123.  
  124.             if (!fix_max || (fc == SUB))
  125.                 ldone = done = TRUE;        /* if end-of-file */
  126.             else {
  127.                 if (fc == STOP) {            /* if stop code */
  128.                     *stop_ptr++ = x + count;
  129.                     *stop_ptr++ = y;
  130.                     fc = ' ';                /* replace w space */
  131.                     }
  132.  
  133.                 switch (fc) {           /* dispatch on special char */
  134.  
  135.                 case CR:               /* carriage return */
  136.                     break;               /* just in case we see one */
  137.  
  138.                 case LF:                /* line-feed */
  139.                     *buff_ptr = '\0';            /* terminate line */
  140.                     ldone = TRUE;        
  141.                     break;
  142.  
  143.                 case HT:                /* horizontal tab */
  144.                     if (count <= (80 - tab_int)) {
  145.                         *buff_ptr++ = ' ';
  146.                         count++;
  147.                         while (count % tab_int) {
  148.                             *buff_ptr++ = ' ';
  149.                             count++;
  150.                             }
  151.                         }
  152.                     break;
  153.  
  154.                 default:                /* all other chars */
  155.         /* store normal char in buffer */
  156.                     if (count <= 80) {     /* do not overrun buffer */
  157.                         *buff_ptr++ = fc;
  158.                         count++;
  159.                         }
  160.                     }
  161.                 }
  162.             }                /* end of char loop */
  163. /*#eject */
  164.     /* send assembled line to the window */
  165.         if (count && !done)  {
  166.             if (!(success = w_gotoxy (x, y)))
  167.                 done = TRUE;
  168.             else
  169.                 w_write (buff);
  170.             }
  171.         y++;                /* advance row for each line */
  172.         }                    /* end of line loop */
  173.  
  174. /* close the file & return */
  175.     *stop_ptr = 0xFFFF;        /* terminate stop table */
  176.     fclose (handle);
  177.     return (success);
  178.     }
  179.